// /**
//  * Definition for singly-linked list.
//  * struct ListNode {
//  *     int val;
//  *     ListNode *next;
//  *     ListNode(int x) : val(x), next(NULL) {}
//  * };
//  */
// class Solution {
// public:
//     ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
//         ListNode *cura = headA, *curb = headB;
//         bool vis1 = true, vis2 = true;
//         while (cura != curb) {
//             if (cura->next == nullptr) {
//                 if (vis1)
//                     vis1 = false;
//                 else
//                     return nullptr;
//                 cura = headB;
//             } else
//                 cura = cura->next;
//             if (curb->next == nullptr) {
//                 if (vis2)
//                     vis2 = false;
//                 else
//                     return nullptr;
//                 curb = headA;
//             } else
//                 curb = curb->next;
//         }
//         return cura;
//     }
// };

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode *cura = headA, *curb = headB;
        int lenA = 0, lenB = 0;
        while (cura) {
            lenA++;
            cura = cura->next;
        }
        while (curb) {
            lenB++;
            curb = curb->next;
        }
        cura = headA;
        curb = headB;
        if (lenA > lenB) {
            int i = lenA - lenB;
            while (i--) {
                cura = cura->next;
            }
        } else {
            int i = lenB - lenA;
            while (i--) {
                curb = curb->next;
            }
        }
        while (cura != curb) {
            cura = cura->next;
            curb = curb->next;
        }
        return cura;
    }
};